/* 
 * File:   Semaforo.h
 * Author: Raphael de Souza, Marcos Moresco e Rafael Atux
 *
 * Created on October 18, 2012, 11:36 PM
 */

#ifndef PRODUTORCONSUMIDOR_H
#define PRODUTORCONSUMIDOR_H

#ifdef  __cplusplus
extern "C" {
#endif

#include "Constantes_Globals.h" //Aqui ja inclui o Processo.h

typedef int semaforo; //Define a variavel semaforo como inteira

// Funcao que inicia a variavel semaforo
void init_semaforo(semaforo s, int n);

// Incrementa o semaforo - Se um ou mais processos estiverem dormindo um deles � acordado.
void incrementa_semaforo(semaforo s, list_bloqueado* l, Processo* p);

// Decrementando o Semaforo - Verifica primeiro se o valor e maior que 0, em caso true decrementa o valor do semaforo (armazena um valor de acordar) e prossegue.
// Em caso false, ou seja, o semaforo com o valor 0, o processo ser� posto para dormir.
void decrementa_semaforo(semaforo s, list_bloqueado* l, Processo* p);

// Verifica se existe algum processo bloqueado
bool existe_processo_bloqueado(list_bloqueado* l);

// Desbloqueia um processo o tirando da lista de processos bloqueados
void desbloqueia_processo(list_bloqueado* l, Processo* p);

// Bloqueia um processo, colocando-o da lista de processos bloqueados
void bloqueia_processo(list_bloqueado* l, Processo* p);

#ifdef  __cplusplus
}
#endif

#endif  /* PRODUTORCONSUMIDOR_H */
